In a typical cloud-based computing environment (e.g., a datacenter), multiple compute nodes may execute workloads (e.g., processes, applications, services, etc.) on behalf of customers. Typically, some of the workloads may have different resource utilization characteristics than other workloads, because the workloads perform difference operations (e.g., high processor utilization to perform data encryption or decryption as compared to high memory utilization to perform data retrieval functions such as executing database searches or streaming media). Furthermore, while the workloads may be generally characterized by a prevalent type of resource utilization, the workloads may exhibit some amount of variability in their resource utilization over time, such as by initially using a relatively high amount of processor capacity, then transitioning to lower processor usage and higher memory usage, and then transitioning to a period of relatively low resource utilization before returning to the period of high processor utilization. As such, for an administrator of the datacenter, the assignment of workloads to various compute nodes may be a frustrating and difficult task, as an initial assignment of workloads among the compute nodes is efficient for only a brief period of time before workloads executed by the same compute node experience contention for one or more of the resources (e.g., two workloads that contemporaneously request high processor utilization). To guard against such resource contention, an administrator may spread the workloads across more compute nodes or equip the compute nodes with additional hardware. However, distributing the workloads across additional hardware leads to added expenses and unused resource capacity during low resource utilization phases of the workloads.